package SecondeStage.XianCheng;

public class SynchronizedThread {
    public static void main(String[] args) {
        SellTicket sellTicket = new SellTicket();
        // 多个线程的锁对象要为同一个对象
        Thread thread = new Thread(sellTicket);
        Thread thread2 = new Thread(sellTicket);
        Thread thread3 = new Thread(sellTicket);
        thread.start();
        thread2.start();
        thread3.start();
    }
}

class SellTicket implements Runnable{
    private  int ticketNum =20; // 多个线程共享
    private boolean loop=true;
    Object object =new Object();

    // 1.在方法上加synchronized，称为同步方法。这时锁在this上。
    public /*synchronized*/ void m(){
        // 2.也可以加在代码块上，称为同步代码块，互斥锁还是在this对象上
        // 3.同样也可以把this换成object,这样3个线程操作的是同一个对象
        synchronized (/*this*/object){
            while (loop){
                if(ticketNum<=0){
                    System.out.println("售票结束");
                    loop=false;
                    return;
                }

                // 休眠50毫秒
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

                System.out.println("窗口 "+Thread.currentThread().getName() + " 售出一张票" + " 剩余票数=" + (--ticketNum));
            }
        }

    }

    // 同步方法(静态的)的锁为 当前类.class
    public synchronized static void m1(){

    }

    public  static void m2(){
        synchronized (SellTicket.class){

        }
    }

    @Override
    public void run() {
        while (loop){
            m();
        }
    }
}